/**
 * 将 Date 转化为指定格式的 String
 * @param {Date|string|number} date - 需要格式化的日期，可以是 Date 对象、日期字符串或时间戳
 * @param {string} fmt - 格式化字符串，例如 "YYYY-MM-DD hh:mm:ss"
 * @returns {string}
 */
export function formatDate(date, fmt = "YYYY-MM-DD") {
  if (!date) return "";

  let d;
  if (date instanceof Date) {
    d = date;
  } else {
    // 兼容 iOS 下的日期格式处理
    const dateStr = typeof date === "string" ? date.replace(/-/g, "/") : date;
    d = new Date(dateStr);
  }

  if (isNaN(d.getTime())) {
    console.error("Invalid date provided to formatDate");
    return "";
  }

  const o = {
    "M+": d.getMonth() + 1, // 月份
    "D+": d.getDate(), // 日
    "h+": d.getHours(), // 小时
    "m+": d.getMinutes(), // 分
    "s+": d.getSeconds(), // 秒
    "q+": Math.floor((d.getMonth() + 3) / 3), // 季度
    S: d.getMilliseconds(), // 毫秒
  };

  if (/(Y+)/.test(fmt)) {
    fmt = fmt.replace(
      RegExp.$1,
      `${d.getFullYear()}`.substr(4 - RegExp.$1.length)
    );
  }

  for (const k in o) {
    if (new RegExp(`(${k})`).test(fmt)) {
      fmt = fmt.replace(
        RegExp.$1,
        RegExp.$1.length === 1 ? o[k] : `00${o[k]}`.substr(`${o[k]}`.length)
      );
    }
  }
  return fmt;
}

/**
 * 计算指定日期字符串在增加或减少N天后的日期
 * @param {string} dateStr - 'YYYY-MM-DD' 格式的日期字符串
 * @param {number} days - 需要增加或减少的天数，可以为负值
 * @returns {string} - 'YYYY-MM-DD' 格式的结果日期字符串
 */
export function addDays(dateStr, days) {
  if (!dateStr || typeof days !== "number") {
    console.error("Invalid arguments provided to addDays");
    return "";
  }

  // 兼容 iOS 下的日期格式处理，并将时间设置为当日的起始，避免时区问题
  const safeDateStr = `${dateStr.replace(/-/g, "/")} 00:00:00`;
  const date = new Date(safeDateStr);

  if (isNaN(date.getTime())) {
    console.error("Invalid date string provided to addDays");
    return "";
  }

  date.setDate(date.getDate() + days);

  return formatDate(date, "YYYY-MM-DD");
}
